package main

import (
	"fmt"
	"os"
	"os/signal"
	"syscall"
)

/**
Go中的Signal发送和处理
Go信号通知机制可以通过往一个channel中发送 os.Signal 实现
 */
func main() {
	//Go signal notification works by sending os.Signal values on a channel.
	// We’ll create a channel to receive these notifications (we’ll also make one to notify us when the program can exit).
	//创建一个os.Signal channel，然后使用 signal.Notify 注册要接收的信号。
	sigs := make(chan os.Signal, 1)
	done := make(chan bool, 1)
	//signal.Notify registers the given channel to receive notifications of the specified signals.

	signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
	//This goroutine executes a blocking receive for signals.
	// When it gets one it’ll print it out and then notify the program that it can finish.

	go func() {
		sig := <-sigs
		fmt.Println()
		fmt.Println(sig)
		done <- true
	}()
	//The program will wait here until it gets the expected signal
	// (as indicated by the goroutine above sending a value on done) and then exit.

	fmt.Println("awaiting signal")
	<-done
	fmt.Println("exiting")
}
